package view.commonview;

import java.awt.BorderLayout;

import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Insets;
import java.awt.geom.Point2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.TitledBorder;

import model.editormodel.LogicEditorElement;
import model.editormodel.LogicSelfdefinedEditorElement;
import view.UtilityConstants;
import controller.commoncontroller.UtilityDialogs;
import controller.editorcontroller.ShowSelfDefinedPictureInWindowListener;

/**
 * Klasse fuer das Anzeigen der internen Schaltung eines
 * selbstdefinierten Bauteils, Erzeugt ein JPanel mit dem Bild der inneren
 * Schaltung eines Bauteils mit der Option dieses in einem eigenen Frame
 * anzuzeigen
 * 
 * @author Team Locsi
 * 
 */
public class SelfdefinedPicturePanel extends JDialog {

	/**
	 * Serial-ID
	 */
	private static final long serialVersionUID = 1L;

	/*
	 * Komponenten der Klasse
	 */
	private JLabel picLabel;
	private JButton frameButton;
	private JPanel buttonPanel;
	private JPanel mainPanel;

	/**
	 * Legt ein neues SelfdefinedPicturePanel an. Bekommt die Parameter
	 * 
	 * @param lEE
	 *            fuer das zugehoerige Bauteil fuer welches das Bild angezeigt
	 *            werden soll und
	 * @param mewz
	 *            fuer die Position des Bauteils
	 */
	public SelfdefinedPicturePanel(final LogicEditorElement lEE, Point2D mewz, InfoArea iArea) {
		this.setUndecorated(true);
		this.mainPanel = new JPanel();
		BufferedImage bimg = null;

		// versucht das beim abspeichern der schaltung als bauteil mit
		// erzeugte bild einzulesen
		File picFile = new File(UtilityConstants.SD_DIRECTORY
				+ ((LogicSelfdefinedEditorElement) lEE).getcModel().getName()
				+ UtilityDialogs.PNG_EXTENSION);

		try {
			if (!picFile.exists()) {
				iArea.addInfoText(
						"Die zugehörige Bilddatei '" + picFile.getName()
								+ "' ist nicht vorhanden!");
			} else {
				bimg = ImageIO.read(picFile);
			}
		} catch (IOException e) {
			iArea.addInfoText("Beim Laden der "
					+ "Schaltungsinformation ist ein Fehler aufgetreten");
		}

		final BufferedImage fimg = bimg;

		// war das einlesen erfolgreich wird ein neues panel mit dem bild
		// erzeugt und angezeigt
		if (bimg != null) {
			this.mainPanel.setLayout(new BorderLayout());
			buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
			buttonPanel.setSize(100, 30);
			frameButton = new JButton(new ImageIcon(getClass().getClassLoader().getResource(UtilityConstants.ICON_PATH
					+ "frame.png")));
			frameButton.setContentAreaFilled(false);
			frameButton.setOpaque(false);
			frameButton.setToolTipText("In eigenem Fenster öffnen");
			frameButton.setSize(30, 30);
			frameButton.setLocation(50, 50);
			frameButton.setMargin(new Insets(0, 0, 0, 0));

			// actionlistener fuer den button, mit welchem man das bild in
			// einem eigenen fenster anzeigen kann
			ShowSelfDefinedPictureInWindowListener ssdpiw = new ShowSelfDefinedPictureInWindowListener(
					fimg, lEE, this);
			this.mainPanel.addMouseListener(ssdpiw);
			this.frameButton.addMouseListener(ssdpiw);

			this.mainPanel.add(buttonPanel, BorderLayout.SOUTH);
			buttonPanel.add(frameButton, BorderLayout.EAST);
			buttonPanel.setBackground(Color.white);
			buttonPanel.setBorder(BorderFactory.createMatteBorder(1, 0, 0, 0,
					Color.GRAY));
			int factorW = bimg.getWidth() / 300;
			int factorH = bimg.getHeight() / 150;
			int factor = Math.max(factorW, factorH);

			// das label mit dem bild wird auf eine bestimmte groesse
			// skaliert
			picLabel = new JLabel(new ImageIcon(bimg.getScaledInstance(
					bimg.getWidth() / factor, bimg.getHeight() / factor,
					BufferedImage.SCALE_SMOOTH)));

			//skalieren des dialogs
			this.setSize((bimg.getWidth() / factor),
					(bimg.getHeight() / factor + 70));
			this.mainPanel.add(picLabel);
			
			((BorderLayout) this.getLayout()).setVgap(-5);
			this.mainPanel.setBorder(BorderFactory.createTitledBorder(
					BorderFactory.createLineBorder(Color.GRAY), lEE.getName(),
					TitledBorder.LEFT, TitledBorder.BOTTOM));
		} else {
			this.setLayout(new BorderLayout());
			this.setSize(250, 50);
			this.mainPanel.add(new JLabel("Bilddatei '" + picFile.getName()
					+ "' nicht vorhanden!"));
			((BorderLayout) this.getLayout()).setVgap(-5);
			this.mainPanel.setBorder(BorderFactory.createTitledBorder(
					BorderFactory.createLineBorder(Color.GRAY), lEE.getName(),
					TitledBorder.LEFT, TitledBorder.BOTTOM));
			this.repaint();
		}
		this.add(mainPanel);
	}
}
